package com.example.contextcube.util;

import android.content.Context;
import android.content.SharedPreferences;
import android.util.Base64;
import android.util.Log;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 用户管理类
 * 处理用户创建、验证等功能
 */
public class UserManager {
    private static final String TAG = "UserManager";
    
    // SharedPreferences名称
    private static final String PREFS_NAME = "user_credentials";
    
    // 保存用户凭证信息的SharedPreferences
    private SharedPreferences userPrefs;
    
    /**
     * 构造函数
     * @param context 上下文
     */
    public UserManager(Context context) {
        // 使用普通的SharedPreferences
        userPrefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        Log.d(TAG, "已初始化用户凭证存储");
    }
    
    /**
     * 创建新用户
     * @param username 用户名
     * @param password 密码
     * @return 是否创建成功
     */
    public boolean createUser(String username, String password) {
        if (isUserExists(username)) {
            // 用户已存在
            return false;
        }
        
        try {
            // 哈希密码
            String hashedPassword = hashPassword(password);
            
            // 保存用户凭证
            userPrefs.edit()
                    .putString(username, hashedPassword)
                    .apply();
            
            Log.d(TAG, "用户创建成功: " + username);
            return true;
            
        } catch (Exception e) {
            Log.e(TAG, "创建用户时出错: " + e.getMessage());
            return false;
        }
    }
    
    /**
     * 验证用户凭证
     * @param username 用户名
     * @param password 密码
     * @return 是否验证成功
     */
    public boolean authenticate(String username, String password) {
        try {
            // 获取保存的密码哈希值
            String savedHash = userPrefs.getString(username, null);
            
            if (savedHash == null) {
                // 用户不存在
                Log.d(TAG, "验证失败: 用户不存在");
                return false;
            }
            
            // 哈希输入的密码
            String inputHash = hashPassword(password);
            
            // 比较哈希值
            boolean success = savedHash.equals(inputHash);
            
            if (success) {
                Log.d(TAG, "验证成功: " + username);
            } else {
                Log.d(TAG, "验证失败: 密码错误");
            }
            
            return success;
            
        } catch (Exception e) {
            Log.e(TAG, "验证用户时出错: " + e.getMessage());
            return false;
        }
    }
    
    /**
     * 检查用户是否存在
     * @param username 用户名
     * @return 是否存在
     */
    public boolean isUserExists(String username) {
        return userPrefs.contains(username);
    }
    
    /**
     * 删除用户
     * @param username 用户名
     * @return 是否删除成功
     */
    public boolean deleteUser(String username) {
        try {
            userPrefs.edit()
                    .remove(username)
                    .apply();
            
            Log.d(TAG, "用户删除成功: " + username);
            return true;
            
        } catch (Exception e) {
            Log.e(TAG, "删除用户时出错: " + e.getMessage());
            return false;
        }
    }
    
    /**
     * 修改用户密码
     * @param username 用户名
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 是否修改成功
     */
    public boolean changePassword(String username, String oldPassword, String newPassword) {
        // 先验证旧密码
        if (!authenticate(username, oldPassword)) {
            // 旧密码验证失败
            return false;
        }
        
        try {
            // 哈希新密码
            String newHash = hashPassword(newPassword);
            
            // 保存新密码
            userPrefs.edit()
                    .putString(username, newHash)
                    .apply();
            
            Log.d(TAG, "密码修改成功: " + username);
            return true;
            
        } catch (Exception e) {
            Log.e(TAG, "修改密码时出错: " + e.getMessage());
            return false;
        }
    }
    
    /**
     * 获取所有用户名
     * @return 用户名列表
     */
    public String[] getAllUsernames() {
        return userPrefs.getAll().keySet().toArray(new String[0]);
    }
    
    /**
     * 对密码进行哈希处理
     * @param password 原始密码
     * @return 哈希后的密码
     */
    private String hashPassword(String password) {
        try {
            // 使用SHA-256进行哈希
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] hash = digest.digest(password.getBytes());
            
            // 转换为Base64字符串
            return Base64.encodeToString(hash, Base64.NO_WRAP);
            
        } catch (NoSuchAlgorithmException e) {
            Log.e(TAG, "哈希密码时出错: " + e.getMessage());
            // 简单回退，使用不安全的方法
            return password + "_hashed";
        }
    }
} 